#pragma once
#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <assert.h>
#include <pthread.h>

typedef struct Queue Queue;       // 队列结构体
typedef struct Node Node;         // 节点结构体
typedef struct Task Task;         // 任务结构体（函数+参数）

struct Queue {
    Node* front;           // 队头
    Node* rear;            // 队尾
    uint32_t size;         // 当前元素个数
    uint32_t capacity;     // 队列最大容量
};

struct Node {
    Task *task;    // 任务结构体
    Node *prev;    // 指向上一个节点的指针
    Node *next;    // 指向下一个节点的指针
};

struct Task {
    void *ret;                     // 函数返回值(使用堆内存)
    void* (*func)(void *arg);      // 函数指针
    void *arg;                     // 函数参数
    bool ready;                    // 任务完成状态
    pthread_mutex_t mutex;         // 保护结果的互斥锁
};

Queue *queue_create(const uint32_t capacity);       // 创建队列
void queue_destroy(Queue *queue);                   // 销毁队列
bool queue_empty(Queue *queue);                     // 判断队列是否为空
bool queue_full(Queue *queue);                      // 判断队列是否已满
bool queue_push(Queue *queue, Task *task);          // 入队列
Task *queue_pop(Queue* queue);                      // 出队列
void queue_print(Queue *queue);

#endif  // __QUEUE_H__
